#!/usr/bin/env bash
# 这个文件中的函数可能部分来源于dylanaraps的pure-bash-bible项目。其中一些可能已经有所修改，详细请参考其原项目（地址： https://github.com/dylanaraps/pure-bash-bible）。

# 检测程序是否安装
check_system_install() {
    # 用法: check_system_install 程序名称
    if ! type -p $1 &>/dev/null; then
        return 1
    fi
    return 0;
}

# 获取系统时间
system_date() {
    # 用法: system_date "format"
    # 通过 "man strftime"看格式
		printf "%($1)T\\n" "-1"
}

# 生成一个V4版本的UUID
system_uuid() {
    # 用法: system_uuid
    C="89ab"
    for ((N=0;N<16;++N)); do
        B="$((RANDOM%256))"

        case "$N" in
            6)  printf '4%x' "$((B%16))" ;;
            8)  printf '%c%x' "${C:$RANDOM%${#C}:1}" "$((B%16))" ;;

            3|5|7|9)
                printf '%02x-' "$B"
            ;;

            *)
                printf '%02x' "$B"
            ;;
        esac
    done

    printf '\n'
}

# 进度条  [#####     ] 50%
system_bar() {
    # 用法: system_bar 1 10
    #                  ^----- 已经完成的百分比 (0-100).
    #                     ^--- 字符总长度.
    ((elapsed=$1*$2/100))

    # 创建空格表示的进度条
    printf -v prog  "%${elapsed}s"
    printf -v total "%$(($2-elapsed))s"

    printf '\033[s%s\033[u' "[${prog// /#}${total}] $1% "
}

# 将十六进制颜色转换为RGB
hex_to_rgb() {
    # 用法：hex_to_rgb "#FFFFFF"
    #        hex_to_rgb "000000"
    : "${1/\#}"
    ((r=16#${_:0:2},g=16#${_:2:2},b=16#${_:4:2}))
    printf '%s\n' "$r $g $b"
}

# 将RGB颜色转换为十六进制
rgb_to_hex() {
    # 用法：rgb_to_hex "r" "g" "b"
    printf '#%02x%02x%02x\n' "$1" "$2" "$3"
}

# sleep
system_sleep() {
    # 用法: system_sleep 1
    #       system_sleep 0.2
    if check_system_install "sleep"; then
        sleep "$1"
    else
        # 通过read延时实现sleep，用于替代外部命令sleep。
        read -rt "$1" <> <(:) || :
    fi
}

# 获取函数列表
get_functions() {
    # 用法：get_functions
    IFS=$'\n' read -d "" -ra functions < <(declare -F)
    printf '%s\n' "${functions[@]//declare -f }"
}

# 获取当前bash版本
get_system_bash_version() {
    # 用法: get_system_bash_version
    printf "%s\n" "$BASH_VERSION"
}

# 获取当前bash版本的详细信息
get_system_bash_version_info() {
    # 用法: get_system_bash_version_info
    printf "%s\n" "${BASH_VERSINFO[@]}"
}

# 获取主机名
get_host_name(){
    # 用法: get_host_name
    printf "%s\n" "${HOSTNAME:-$(hostname)}"
}

# 获取用户名
get_user_name(){
    # 用法: get_user_name
    : \\u && printf '%s\n' "${_@P}"
}

# 获取系统名称
get_ostype(){
    # 用法: get_ostype
    printf "%s\n" "$OSTYPE"
}

# 获取脚本运行时间
get_run_time()
{
    # 用法 get_run_time
    printf "%s\n" "$SECONDS"
}

# 获取当前终端大小（行x列）
get_term_size() {
    # 用法: get_term_size

    # (:;:) 是一个短暂暂停，以确保变量立即导出
    shopt -s checkwinsize; (:;:)
    printf '%s\n' "$LINES $COLUMNS"
}

# 获取当前光标位置（行 列）
get_cursor_pos() {
    # 用法: get_cursor_pos
    IFS='[;' read -p $'\e[6n' -d R -rs _ y x _
    printf '%s\n' "$[x-1] $y"
}

# 查找并获取输入参数
find_arg()
{
    # 用法: find_arg [选项] 参数列表，如:查找-v 后面的输入参数 find_arg "-v" $*
    option=$1
    IFS=' ' args=("${@:2:$#-1}")
    [[ $option == "" ]] && return 1
    FINDARG=
    for arg in ${args[@]}; do
        [[ $FINDARG ]] && echo "$arg" && return 0
        [[ "$arg" == "$option" ]] && FINDARG=1
    done
    return 1
}

# 显示置顶
pushtop()
{
    shopt -s checkwinsize; (:;:)
    local ps=""
    for ((i=$LINES; i > 1; i--)); do
        ps+="\n"
    done
    printf "$ps\033c"
}